package wh.只出现一次的数字;

import java.util.*;

/**
 * @author: wh(1835734390 @ qq.com)
 * @date: 2022/4/5 13:09
 * @description:给定一个非空整数数组，除了某个元素只出现一次以外，其余每个元素均出现两次。找出那个只出现了一次的元素
 * @version:
 */
public class Solution {
    public static void main(String[] args) {
        int[] arr = {4,1,2,1,2};
        int i = singleNumber3(arr);
        System.out.println(i);
    }
    //方法1 运用集合
    public static int singleNumber(int[] nums) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < nums.length ; i++) {
            if(list.contains(nums[i])){
                //删除集合中该值
                //new Integer(nums[i]) 为引用类型  nums[i]为普通类型的int型
                boolean remove = list.remove(new Integer(nums[i]));
            }else {
                list.add(nums[i]);
            }
        }
        Integer integer = list.get(0);
        return integer;
    }


    //方法2 运用hash表
    public static int singleNumber2(int[] nums){
        Map<Integer,Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            Integer integer = map.get(new Integer(nums[i]));
            //如果map中不存在值为nums[i]的key
            if (integer == null){
                map.put(nums[i],1);
            }else {
                //如果存在,则把对应的value加一
                map.put(nums[i],integer + 1);
            }
        }
        System.out.println(map);
        //Collection<Integer> values = map.values();
        Set<Integer> set = map.keySet();//将key作为元素转存入一个set集合
        //迭代器
        for (Integer i: set) {
            if(map.get(i).equals(1)){
                return i;
            }
        }
        return -100;
    }

    //解法3 异或运算
    public static int singleNumber3(int[] nums){
        int single = 0;
        for (int num : nums) {
            single ^= num;
        }
        return single;
    }

}
